/*
 * @Author: error: error: git config user.name & please set dead value or install git && error: git config user.email & please set dead value or install git & please set dead value or install git
 * @Date: 2024-03-19 10:01:32
 * @LastEditors: error: error: git config user.name & please set dead value or install git && error: git config user.email & please set dead value or install git & please set dead value or install git
 * @LastEditTime: 2024-03-19 17:42:19
 * @FilePath: \MDK-ARMf:\WorkSpace(LONG)\Washing_machine_V1\User\app\api_wash.h
 * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
 */
#ifndef _API_WASH_H_
#define _API_WASH_H_
#include "motor_run.h"

#define FILL_WATER_TIME_OUT         	5   /* 5min */
#define DRAIN_WATER_HOLD_TIME			5   /* 5min */
#define RINSE_ONCE_TIME					5   /* 5min */
#define SPIN_ONCE_TIME					5   /* 5min */

#define MOTOR_RINSE_SPEED				100
#define MOTOR_WASH_SPEED				100
#define MOTOR_DRAIN_SPEED				500
#define COM_CNT							(3*ENCODER_TOTAL_RESOLUTION)		/* 洗衣换相圈数 */

#define BEEP_TIME						(0X5)

typedef struct{
	uint8_t door_open:1;		/* 洗衣门未关 */
	uint8_t fill_timeout:1;		/* 注水超时 */
	uint8_t low_voltage:1;		/* 低电压 */
	uint8_t :5;
}sys_err_t;

typedef union{
	uint8_t all;
	sys_err_t err;
}sys_err_u;

typedef struct {
    uint32_t interval; // 定时器周期
    uint32_t count;    // 定时器计数器
    uint8_t running;   // 定时器状态，0表示停止，1表示运行
    uint8_t direction; // 计数方向，0表示向上计数，1表示向下计数
    uint8_t overflow;  // 溢出标记，1表示溢出，0表示未溢出
}timer_t;

/* 方便演示分钟按秒执行 */
typedef struct{	
	uint8_t power;				/* 电源 */
	uint8_t auto_off;			/* 自动关机 */
	uint8_t run_mode;			/* 运行模式 0-停止 1-启动 2-暂停 3-设置 4-报警 */
	uint8_t work_mode;			/* 工作模式 1-预约 2-浸泡 3-洗涤 4-漂洗 5-脱水 6-进水 7-排水 8-完成 */
	uint8_t laundry_program;	/* 洗衣程序 标准洗 快速洗 浸泡洗 洗涤 漂洗 筒自洁 单脱水  */
	
	uint8_t ref_time;			/* 时间基准源选择 0-min 1-sec*/
	
	uint8_t sum_run_time;		/* 预计时间 注水-浸泡-洗涤-排水-注水-漂洗-排水-脱水 */
	uint8_t cur_run_time;		/* 实际时间 注水-浸泡-洗涤-排水-注水-漂洗-排水-脱水 */
	
	timer_t soft_timer;			/* 软件定时器 */

	/* 预约 */
	uint32_t plan_time;			/* 预约时间 0-24小时（精确到分钟） */

	/* 浸泡 */
	uint8_t soak_time;			/* 浸泡时间 10-30分钟 */

	/* 洗涤 */
	uint8_t wash_time;			/* 洗涤时间 2-30分钟 */

	/* 漂洗 */
	uint8_t rinse_cnt;			/* 漂洗次数 1-5次 一次10分钟进水3分钟 漂洗4分钟 排水3分钟 方便查看现象 */
	uint8_t finsih_rinse_cnt;	/* 漂洗完成次数计数器 */
	
	/* 脱水 */
	uint8_t spin_intensity;		/* 脱水力度 0-4档 不脱水 300rpm 600rpm 900rpm 1200rpm 时间固定3分钟 */

	/* 加热 */
	uint8_t heat_enable;		/* 加热使能 */
	uint8_t tar_water_temp;		/* 设定水温 */

	/* 注水 */
	uint8_t fill_enable;		/* 注水使能 默认超时2分钟未到水位报警 */
	uint8_t fill_level;			/* 注水高度 0-3 */

	/* 排水 */
	uint8_t drain_enable;		/* 排水使能 默认2分钟 */
	uint8_t drain_time;			/* 排水计时器 */
	uint8_t drain_open;			/* 排水控制 */

	sys_err_u err;				/* 故障警告 */

	int32_t last_pluse;			/* 上一次存储的脉冲计数值 用于计算圈数 */
}washer_t;	

extern washer_t g_wash;
extern void (*wash_task)(void);

void api_wash_task(void);
void beep_mode_task(void);
void plan_mode_task(void);
void soak_mode_task(void);
void wash_mode_task(void);
void rinse_mode_task(void);
void spin_mode_task(void);
void fill_mode_task(void);
void drain_mode_task(void);
void heat_ctrl_task(void);
void stop_mode_task(void);
void suspend_mode_task(void);
void err_mode_task(void);

void wash_sw_timer_isr(void);

#endif /* _API_WASH_H_ */
